/**
 * 环形链表
 */

bool hasCycle(struct ListNode *head)
{
  /**
   * 1. 定义 fast（快）指针, 步长为【2】, fast->next->next, 判断条件 fast->next != NULL
   * 2. 定义 slow（慢）指针, 步长为【1】, slow->next, 判断条件 slow->next != NULL
   * 3. 快慢指针同时走
   * 4. 如果链表存在【环路】,那么【快、慢】指针, 都会进入环内
   * 5. 那么【快】指针一定会【追上】【慢】指针, 从而两个指针【相遇】
   */

  struct ListNode *slow = head;
  struct ListNode *fast = head;

  while (slow && fast->next)
  {
    // 如果【fast 下一个】等于【slow】则说明【存在】环路
    if (fast->next == slow)
      return true;

    // 否则 fast 后移2个位置，slow 后移一个位置
    slow = slow->next; // 步长 1
    fast = fast->next->next; // 步长 2
  }

  return false;
}
